lib: clean up types for RepoCheckoutFilter
authorFelix Krull <f_krull@gmx.de>
Wed, 12 Jun 2019 18:18:58 +0000 (20:18 +0200)
committerColin Walters <walters@verbum.org>
Fri, 6 May 2022 16:53:54 +0000 (12:53 -0400)
rust-bindings/rust/src/repo_checkout_at_options.rs
rust-bindings/rust/src/repo_checkout_at_options/repo_checkout_filter.rs

index 522b16f9225b9cbfa1ac075f450ac44e923d0344..954a19fd12fe53a68100e33a0f16998a44b98e63 100644 (file)
@@ -1,8 +1,7 @@
-use self::repo_checkout_filter::filter_trampoline;
 use glib::translate::{Stash, ToGlib, ToGlibPtr};
 use glib_sys::gpointer;
 use libc::c_char;
-use ostree_sys::{OstreeRepo, OstreeRepoCheckoutAtOptions, OstreeRepoCheckoutFilterResult};
+use ostree_sys::OstreeRepoCheckoutAtOptions;
 use std::path::{Path, PathBuf};
 use {Repo, RepoCheckoutFilterResult};
 use {RepoCheckoutMode, RepoCheckoutOverwriteMode};
@@ -24,7 +23,7 @@ pub struct RepoCheckoutAtOptions {
     pub force_copy_zerosized: bool,
     pub subpath: Option<PathBuf>,
     pub devino_to_csum_cache: Option<RepoDevInoCache>,
-    pub filter: RepoCheckoutFilter,
+    pub filter: Option<RepoCheckoutFilter>,
     pub sepolicy: Option<SePolicy>,
     pub sepolicy_prefix: Option<String>,
 }
@@ -81,18 +80,8 @@ impl<'a> ToGlibPtr<'a, *const OstreeRepoCheckoutAtOptions> for RepoCheckoutAtOpt
         options.sepolicy = sepolicy.0;
 
         if let Some(filter) = &self.filter {
-            options.filter_user_data = filter
-                as *const Box<dyn Fn(&Repo, &Path, &libc::stat) -> RepoCheckoutFilterResult>
-                as gpointer;
-            options.filter = Some(
-                filter_trampoline
-                    as unsafe extern "C" fn(
-                        *mut OstreeRepo,
-                        *const c_char,
-                        *mut libc::stat,
-                        gpointer,
-                    ) -> OstreeRepoCheckoutFilterResult,
-            );
+            options.filter_user_data = filter as *const RepoCheckoutFilter as gpointer;
+            options.filter = repo_checkout_filter::trampoline();
         }
 
         Stash(options.as_ref(), (options, subpath, sepolicy_prefix))
@@ -184,24 +173,10 @@ mod tests {
             );
             assert_eq!((*ptr).unused_ints, [0; 6]);
             assert_eq!((*ptr).unused_ptrs, [ptr::null_mut(); 3]);
-            assert_eq!(
-                (*ptr).filter,
-                Some(
-                    filter_trampoline
-                        as unsafe extern "C" fn(
-                            *mut OstreeRepo,
-                            *const c_char,
-                            *mut libc::stat,
-                            gpointer,
-                        )
-                            -> OstreeRepoCheckoutFilterResult
-                )
-            );
+            assert_eq!((*ptr).filter, repo_checkout_filter::trampoline());
             assert_eq!(
                 (*ptr).filter_user_data,
-                options.filter.as_ref().unwrap()
-                    as *const Box<dyn Fn(&Repo, &Path, &libc::stat) -> RepoCheckoutFilterResult>
-                    as gpointer
+                options.filter.as_ref().unwrap() as *const RepoCheckoutFilter as gpointer
             );
             assert_eq!((*ptr).sepolicy, options.sepolicy.to_glib_none().0);
             assert_eq!(
index ff455425518b46c3d81255724278783c2844f1f4..e74016ad01a063f156a9dd319d0b8961f6c13a2c 100644 (file)
@@ -5,20 +5,29 @@ use libc::c_char;
 use ostree_sys::{OstreeRepo, OstreeRepoCheckoutFilterResult};
 use std::path::{Path, PathBuf};
 
-pub type RepoCheckoutFilter =
-    Option<Box<dyn Fn(&Repo, &Path, &libc::stat) -> RepoCheckoutFilterResult>>;
+pub type RepoCheckoutFilter = Box<dyn Fn(&Repo, &Path, &libc::stat) -> RepoCheckoutFilterResult>;
 
-pub(super) unsafe extern "C" fn filter_trampoline(
+unsafe extern "C" fn filter_trampoline(
     repo: *mut OstreeRepo,
     path: *const c_char,
     stat: *mut libc::stat,
     user_data: gpointer,
 ) -> OstreeRepoCheckoutFilterResult {
     // TODO: handle unwinding
-    let closure =
-        user_data as *const Box<dyn Fn(&Repo, &Path, &libc::stat) -> RepoCheckoutFilterResult>;
+    let closure = user_data as *const RepoCheckoutFilter;
     let repo = FromGlibPtrNone::from_glib_none(repo);
     let path: PathBuf = FromGlibPtrNone::from_glib_none(path);
     let result = (*closure)(&repo, &path, &*stat);
     result.to_glib()
 }
+
+pub(super) fn trampoline() -> Option<
+    unsafe extern "C" fn(
+        *mut OstreeRepo,
+        *const c_char,
+        *mut libc::stat,
+        gpointer,
+    ) -> OstreeRepoCheckoutFilterResult,
+> {
+    Some(filter_trampoline)
+}